package main

import (
	"fmt"
	"reflect"
)

// 反射是指在程序运行期间对程序本身进行访问和修改的能力。
// 正常情况程序在编译时，变量被转换为内存地址，变量名不会被编译器写入到可执行部分。
// 在运行程序时，程序无法获取自身的信息。
// 支持反射的语言可以在程序编译期将变量的反射信息，如字段名称、类型信息、结构体信息等整合到可执行文件中，并给程序提供接口访问反射信息，这样就可以程序运行期获取类型的反射信息，并且有能力修改它们。

//	不想写了。。。。。。

// reflect.Typeof.
type Person struct {
	Name string
	Age  int
}

func reflectfn(x interface{}) {
	v := reflect.TypeOf(x)
	name := v.Name() // 类型名称
	kind := v.Kind() // 种类
	fmt.Println(name, kind)
	fmt.Println(v)
}

// reflect.valuof

func reflectfn2(x interface{}) {
	var num = 10 + reflect.ValueOf(x).Int()
	fmt.Println(num)
}
func main() {
	a := 10
	b := "hello"
	reflectfn(a) // int int int
	reflectfn(b) // string string string

	c := Person{"zhangsan", 10}
	reflectfn(c) // Person struct,  main.Person

	fmt.Println("============================")

	reflectfn2(a) // 20
	reflectfn2(b)
}
